
const fp = require('loadsh/fp')
let test =null //验证this指向
class IO {
    static of(value){
        return new IO(function(){
            console.log(this == test,777) //true
            return value})
    }
    constructor(fn){
        this._value = fn
    }
    map(fn){
        test = new IO (fp.flowRight(fn,this._value))
        return test
    }
}
let f = IO.of('abc')
let res = f.map(fp.toUpper)
console.log(res._value())

/**
 * Task函子
 * folktale框架
*/
const fs = require('fs')
const {task} = require('folktale/concurrency/Task')
function readFile(filename){
    return task(resolver => {
        fs.readFile(filename,'utf-8',(err, data)=>{
            if(err) resolver.reject(err)
            resolver.resolve(data)
        })
    })
}

readFile('./package.json')
    .map(fp.split('\n'))
    .map(fp.find(x => x.includes('version')))
    .run()
    .listen({
        onRejected: e=> console.log(e,'err'),
        onResolved: v=> console.log(v,'succ')
    })


/**
 * IO Monad
*/
// class IO {
//     static of(value){
//         return new IO(function(){
//             return value
//         })
//     }
//     constructor(fn){
//         this._value = fn
//     }
//     map(fn){
//         return new IO(fp.flowRight(fn, this._value))
//     }
//     join(){
//         return this._value()
//     }
//     flatMap(fn){
//         return this.map(fn).join()
//     }
// }

// let readfile = (filename) => {
//     return new IO(()=>{
//         return fs.readFileSync(filename)
//     })
// }
// let print = (x) => {
//     return new IO(() => {
//         // console.log(x,999)
//         return x
//     })
// }

// let r = readfile('./package.json')
//         .map(fp.toUpper)
//         .flatMap(print) //=> map(print).join() => fp.flowRight(print, this._value)()
//         .join()

// let obj = {name:'xm'}
// let ali = obj
// obj = null
// console.log("obj", ali)


// var tmp = 123;
// if (true) {
//     console.log(tmp);
//     let tmp;
// }

// var arr = [12, 34, 32, 89, 4]
// let ss = arr.sort((a,b)=> a-b ).shift()
// let ss = Math.min(...arr)
// console.log(ss,99)